﻿using System;
using System.Collections.Generic;
using System.Web;

/// <summary>
/// Clase que permite realizar las actividades basicas que corresponden a la capa de presentacion
/// </summary>
public class ServicioGenerico<T>
{
    /// <summary>
    /// Variable de dao que corresponde a la entidad
    /// </summary>
    protected DaoGenerico<T> dao = null;

    /// <summary>
    /// Entidad que permite la abstraccion a la entidad de la base de datos
    /// </summary>
    public T entidad { get; set; }

    /// <summary>
    /// Representa la cadena de texto que contiene el resultado de la transaccion realizada
    /// </summary>
    public String mensaje { get; set; }

    /// <summary>
    /// Crea una nueva instancia de la clase
    /// </summary>
    public ServicioGenerico()
    {
        this.entidad = Activator.CreateInstance<T>();
        this.dao = new DaoGenerico<T>();
    }

    /// <summary>
    /// Crea un nuevo registro en la base de datos de acuerdo a la entidad
    /// </summary>
    /// <returns>Estado de la transaccion</returns>
    public EstadoTransaccion crearNuevo()
    {
        try
        {
            dao.crear(this.entidad);

            this.mensaje = "Se ha registrado la información satisfactoriamente.";
            return EstadoTransaccion.SATISFACTORIO;

        }
        catch (Exception ex)
        {
            this.mensaje = "Ocurrio un error inesperado realizando la creacion del nuevo registro";
            return EstadoTransaccion.ERRONEO;
        }
    }

    /// <summary>
    /// Realiza la actualizacion del registro de la entidad
    /// </summary>
    /// <returns>Estado de la transaccion</returns>
    public EstadoTransaccion actualizar()
    {
        try
        {
            dao.actualizar(this.entidad);

            this.mensaje = "Se ha actualizado la información satisfactoriamente.";
            return EstadoTransaccion.SATISFACTORIO;
        }
        catch (Exception ex)
        {
            this.mensaje = "Ocurrio un error inesperado realizando la actualizacion del nuevo registro";
            return EstadoTransaccion.ERRONEO;
        }
    }

    /// <summary>
    /// Elimina el registro de la entidad
    /// </summary>
    /// <returns>Estado de la transaccion</returns>
    public EstadoTransaccion eliminar()
    {
        try
        {
            dao.eliminar(this.entidad);

            this.mensaje = "Se ha eliminado el registro satisfactoriamente.";
            return EstadoTransaccion.SATISFACTORIO;

        }
        catch (Exception ex)
        {
            this.mensaje = "Ocurrio un error inesperado elimiando el registro";
            return EstadoTransaccion.ERRONEO;
        }
    }
   
    /// <summary>
    /// Realiza la actualizacion del registro de la entidad
    /// </summary>
    /// <returns>Estado de la transaccion</returns>
    public List<T> filtrar()
    {
        try
        {
            return dao.filtrar(this.entidad);
        }
        catch (Exception ex)
        {
            this.mensaje = "Ocurrio un error inesperado realizando el retorno de registros";
        }
        return null;
    }


    /// <summary>
    /// Obtiene el listado de todos los registros de la entidad
    /// </summary>
    /// <returns>Listado de objetos que contiene la entidad</returns>
    public List<T> listar()
    {
        try
        {
            return dao.listar(this.entidad);
        }
        catch (Exception ex)
        {
            this.mensaje = "Ocurrio un error inesperado realizando la consulta de la informacion";
        }
        return null;
    }
}
